const errorType = require("../constans/error-types");
const { logger } = require("../../logger");
const Label = require("../model/label.model");
const { Op } = require("sequelize");

class LabelController {
  async create(ctx, next) {
    try {
      const { name } = ctx.request.body;
      if (!name) {
        const error = new Error(errorType.NOPARAMETER);
        return ctx.app.emit("error", error, ctx);
      }
      await Label.create({
        name,
      })
        .then((res) => {
          ctx.success(res);
        })
        .catch((err) => {
          ctx.fail();
          console.log(err);
        });
    } catch (error) {
      logger.error(error);
      console.log(error);
    }
  }

  async detail(ctx, next) {
    try {
      const { labelId } = ctx.params;
      if (!labelId) {
        const error = new Error(errorType.NOPARAMETER);
        return ctx.app.emit("error", error, ctx);
      }
      await Label.findOne({
        where: { id: labelId },
        raw: true,
      })
        .then((res) => {
          ctx.success(res);
        })
        .catch((err) => {
          ctx.fail(99);
          console.log(err);
        });
    } catch (error) {
      logger.error(error);
      console.log(error);
    }
  }

  async list(ctx, next) {
    try {
      const { limit, offset, keyword } = ctx.query;
      if (!limit || !offset) {
        const error = new Error(errorType.NOPARAMETER);
        return ctx.app.emit("error", error, ctx);
      }
      await Label.findAndCountAll({
        where: {
          name: {
            [Op.like]: `%${keyword}%`,
          },
        },
        limit: parseInt(limit),
        offset: parseInt(limit) * parseInt(offset - 1),
      })
        .then((res) => {
          ctx.success({
            list: res.rows,
            total: res.count,
            limit,
            offset,
          });
        })
        .catch((err) => {
          ctx.fail();
          console.log(err);
        });
    } catch (error) {
      logger.error(error);
      console.log(error);
    }
  }

  async update(ctx, next) {
    try {
      const { name, id } = ctx.request.body;
      await Label.update(
        { name },
        {
          where: {
            id,
          },
        }
      )
        .then((res) => {
          res[0] ? ctx.success() : ctx.fail();
        })
        .catch((err) => {
          ctx.fail();
          console.log(err);
        });
    } catch (error) {
      logger.error(error);
      console.log(error);
    }
  }

  async remove(ctx, next) {
    try {
      const { labelId } = ctx.params;
      await Label.destroy({
        where: {
          id: labelId,
        },
      })
        .then((res) => {
          // 这样判断好像不太合理
          res ? ctx.success() : ctx.fail("");
        })
        .catch((err) => {
          ctx.fail();
          console.log(err);
        });
    } catch (error) {
      logger.error(error);
      console.log(error);
    }
  }
}

module.exports = new LabelController();
